package math

import "cc.kristar/jvmgo/ch05/instructions/base"
import "cc.kristar/jvmgo/ch05/rtda"

type ISHL struct{ base.NoOperandsInstruction } // int左位移

type ISHR struct{ base.NoOperandsInstruction } // int算术右位移

type IUSHR struct{ base.NoOperandsInstruction } // int逻辑右位移

type LSHL struct{ base.NoOperandsInstruction } // long左位移

type LSHR struct{ base.NoOperandsInstruction } // long算术右位移

type LUSHR struct{ base.NoOperandsInstruction } // long逻辑右位移

func (self *ISHL) Execute(frame *rtda.Frame) {
	stack := frame.OperandStack()
	v2 := stack.PopInt()
	v1 := stack.PopInt()
	// 因为是对 Int 类型进行移位，这里是 32 位
	// 所以最大是移位 32 位，所以使用 5 bit 就可以表示所有位数
	s := uint32(v2) & 0x1f
	result := v1 << s
	stack.PushInt(result)
}